iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

第三方庫能讓別的專案使用的關鍵是能夠讓別人找到它的頭文件和庫文件。
而之前在 "第五章 版本與安裝"中,主程式都事先知道安裝的頭文件與鍊結庫的路徑,這明顯不太符合實際情況,因為大型的第三方庫,頭文件與庫文件都依照自己定義的路徑儲存。
因此,CMake提供了第三方庫與使用者之間的接口,第三方庫將庫文件與頭文件的路徑存放在Config檔中,而使用者透過 find_package() 指令找到第三方庫的Config檔後,就可以透過自動產生的變數使用第三方庫了。

find_package搜尋第三方庫的過程介紹

find_package(),有兩種模式,一種是Module模式,另一種是Config模式,這兩種模式都會搜尋第三方庫的Config設定檔,透過這個檔案就可以定位到第三方庫的頭文件與鍊結庫的路徑。

Module模式

find_package 預設使用Module模式。
在 Module 模式下,CMake 會在路徑中查找名為 Find.cmake 的檔案,會先在$ {CMAKE_MODULE_PATH} 變數對應的路徑中尋找,如果找不到,才會到$ {CMAKE_ROOT} 變數對應的路徑中尋找。

  • ${CMAKE_MODULE_PATH} : 預設為空值
  • ${CMAKE_ROOT} : 預設在 /usr/share/cmake-/Modules

Config模式

如果在 Module模式找不到,find_package 就會轉為 Config 模式。
在 Config 模式下,CMake 會在路徑中查找名為 Config.cmake或-config.cmake 的檔案。
Config模式的搜尋路徑有很多

  1. ${_DIR} : 預設為空值
  2. ${CMAKE_PREFIX_PATH}、 $ {CMAKE_FRAMEWORK_PATH}、${CMAKE_APPBUNDLE_PATH} : 預設為空值
  3. PATH : 系統的環境變數,這個變數就是我們在terminal中輸入後能夠執行的各種執行檔,不用特別cd到該執行檔路徑下的原因。
    例如在Day 17中,我們下載並安裝 ABI Compliance Cheacker 之後為什麼可以直接在任何目錄下執行,而不用cd到 /bin 路徑中。

$ abi-dumper <OLD.so> -o <ABI-0.dump> -lver 0
$ cd /bin
kai@esoc:/bin$ ./abi-dumper <OLD.so> -o <ABI-0.dump> -lver 0

kai@esoc:~$ echo $PATH
/home/kai/miniconda3/condabin:/home/kai/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/local/cuda/bin

而第三方庫通常會將 xxx.cmake 安裝到此 PATH 路徑下。

find_package() 定義的變數

在成功找到第三方庫之後,通常會定義以下變量,我們就可以依此來鍊結第三方庫。

${<NAME>_FOUND}
${<NAME>_INCLUDE_DIRS}, ${<NAME>_INCLUDES}
${<NAME>_LIBRARIES}, ${<NAME>_LIBRARIES_DIRS}, ${<NAME>_LIBS}
${<NAME>_DEFINITIONS}

find_package()語法

find_package(<package_name1> [REQUIRED] [[COMPONENTS] name1 name2 ...]
             <package_name2> [REQUIRED] [[COMPONENTS] name1 name2 ...]
             ...)
REQUIRED : 如果找不到該庫,就停止編譯並報錯
COMPONENTS : 該庫所依賴的其他組件

上一篇
[Day 18] 版本號與宏
下一篇
[Day 20] 使用第三方庫--以OpenCV為例
系列文
建構屬於自己的C/C++專案 : 我的30天CMake學習之旅29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言